/**
 * User: Clinton Begin
 * Date: Jul 13, 2003
 * Time: 7:21:30 PM
 */
package com.juanfrivaldes.cio2005.persistence.sqlmapdao;

import java.util.Iterator;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.juanfrivaldes.cio2005.dao.PonenciaDao;
import com.juanfrivaldes.cio2005.domain.Ponencia;
import com.juanfrivaldes.cio2005.domain.Revision;
import com.juanfrivaldes.cio2005.domain.RevisionFinal;

public class PonenciaSqlMapDao extends SqlMapClientDaoSupport implements
		PonenciaDao {

	private SecuenciaSqlMapDao secuenciaDao;

	/**
	 * @return Returns the secuenciaDao.
	 */
	public SecuenciaSqlMapDao getSecuenciaDao() {
		return secuenciaDao;
	}

	/**
	 * @param secuenciaDao
	 *            The secuenciaDao to set.
	 */
	public void setSecuenciaDao(SecuenciaSqlMapDao secuenciaDao) {
		this.secuenciaDao = secuenciaDao;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.juanfrivaldes.cio2005.dao.PonenciaDao#addPonencia(com.juanfrivaldes.cio2005.domain.Ponencia)
	 */
	public void addPonencia(Ponencia ponencia) throws DataAccessException {
		ponencia.setId(this.secuenciaDao.getNextId("ponencia"));
		getSqlMapClientTemplate().update("insertPonencia", ponencia);
		if (ponencia.getCoautores() != null) {
			Iterator it = ponencia.getCoautores().iterator();

			CoautorLine line;
			while (it.hasNext()) {
				line = new CoautorLine(ponencia.getId(), (String) it.next());
				getSqlMapClientTemplate().update("insertCoautor", line);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.juanfrivaldes.cio2005.dao.PonenciaDao#getPonenciasByUsuario(java.lang.String)
	 */
	public List getPonenciasByUsuario(String usuario)
			throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaListByUser", usuario);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public List getPonencias() throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaList", null);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	/**
	 * @param ponencias
	 */
	private void completarPonencia(List ponencias) {
		Iterator it = ponencias.iterator();
		while (it.hasNext()) {
			Ponencia ponencia = (Ponencia) it.next();
			completarPonencia(ponencia);
		}
	}

	private void completarPonencia(Ponencia ponencia) {
		ponencia.setRevision((Revision) getSqlMapClientTemplate()
				.queryForObject("getRevision",
						new Integer(ponencia.getId())));
		
		ponencia.setRevisionFinal((RevisionFinal) getSqlMapClientTemplate()
				.queryForObject("getRevisionFinal",
						new Integer(ponencia.getId())));
		
		
		ponencia.setCoautores(getSqlMapClientTemplate().queryForList(
				"getCoautores", new Integer(ponencia.getId())));
		
		String tipo=(String)getSqlMapClientTemplate().queryForObject("getIntroduccionFinal",new Integer(ponencia.getId()));
		if(tipo!=null){
			ponencia.setEntregadaFinal(true);
			ponencia.setTipo(tipo);
		}
	}



	/*
	 * (non-Javadoc)
	 * 
	 * @see com.juanfrivaldes.cio2005.dao.PonenciaDao#setRevision(com.juanfrivaldes.cio2005.domain.Revision)
	 */
	public void setRevision(Revision revision) {
		this.getSqlMapClientTemplate().insert("setRevision", revision);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.juanfrivaldes.cio2005.dao.PonenciaDao#getPonenciasByCategoria(java.lang.String)
	 */
	public List getPonenciasByCategoria(String categoria)
			throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaListByCategoria", categoria);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.juanfrivaldes.cio2005.dao.PonenciaDao#getPonenciasWithUsuario(java.lang.String)
	 */
	public List getPonenciasWithUsuario(String usuario)
			throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaListWithUser", usuario);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public List getPonenciasConfirmables() throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaConfirmableList", null);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}
	
	public List getFinalesConfirmables() throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getFinalConfirmableList", null);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public List getPonenciasConfirmablesByCategoria(String categoria) throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getPonenciaConfirmableListByCategoria", categoria);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}
	
	public List getFinalesConfirmablesByCategoria(String categoria) throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getFinalConfirmableListByCategoria", categoria);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public void marcaPonenciaConfirmada(int id) throws DataAccessException {
		getSqlMapClientTemplate().update("marcaPonenciaConfirmada", new Integer(id));
		
	}
	
	

	public Ponencia getPonenciaById(int id) throws DataAccessException {
		Ponencia ponencia=(Ponencia)getSqlMapClientTemplate().queryForObject("getPonenciaById",new Integer(id));
		if (ponencia!=null)
			completarPonencia(ponencia);
		return ponencia;
	}

	public void marcaPonenciaIntroducida(String tipo, int id) throws DataAccessException {
		getSqlMapClientTemplate().insert("marcaPonenciaIntroducida",new IntroduccionLine(id,tipo));
		
	}

	public List getFinalesByCategoria(String categoria) throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getFinalesListByCategoria", categoria);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public List getFinales() throws DataAccessException {
		List ponencias = getSqlMapClientTemplate().queryForList(
				"getFinalesList", null);
		if (ponencias != null && ponencias.size() > 0) {
			completarPonencia(ponencias);
		}
		return ponencias;
	}

	public void setRevisionFinal(RevisionFinal revision) throws DataAccessException {
		this.getSqlMapClientTemplate().insert("setRevisionFinal", revision);

	}

	public void marcaFinalConfirmada(int id) throws DataAccessException {
		getSqlMapClientTemplate().update("marcaFinalConfirmada", new Integer(id));
	}
	
}
